'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.08
 * lastUpdateDate：2018.02.08
 * description：函数的对象参数的解构和默认值的吊炸天用法
 */
// ES6设置默认值方式，变得极致吊炸天
/**
 * 这时候如果直接testFn ()调用为啥会报错，下面我简单解释下：
 * 首先这种testFn ()方法，它内部函数会这样解析，如下：
 * function testFn ({ a = 12, b = 15 } = undefined) {
 *     console.log(a, b);
 * }
 * 你在试图通过undefined.a,undefined.b显然是错误的，那么
 * 如何解决这个问题呢，如下几种方式：
 * 1.testFn ({ });
 * 2.testFn ({ 'a' : 1000000 });
 * 3.testFn ({ 'b' : 1000 })
 * 4.testFn ({ 'a' : 200, 'b' : 5000  });
 * 5.testFn ({ undefined, 'b' : 5000 });
 * 第五种调用方式我解释下：
 * 如果调用testFn ()参数列表里面有undefined，那么就默认取默认值，
 * 除了undefined之外的其它值都是打印这个值，比如testFn ({ null, 'b' : 5000 });
 * 那么此时会抛出错误(这是跟函数的数组参数的解构和默认值唯一的区别)，特别
 * 注意下
 *----------------------------*********-----------------------------
 * 那么我就想testFn ()直接调用有没有办法呢，把函数改造下，如下：
 * function testFn ({ a = 12, b = 15 } = {}) {
 *     console.log(a, b);
 * }
 * 当调用testFn ();不传任何参数的时候它会将右侧的{}.a和{}.b
 * 进行赋值，所以就可以正常打印结果了
 */
function testFn ({ a = 12, b = 15 }) {
    console.log(a, b);
}

// error
// testFn();

// result：12 15
// testFn ({ });

// result：1000000 15
// testFn ({ 'a' : 1000000 });

// result：12 1000
// testFn ({ 'b' : 1000 });

// result：200 5000
// testFn ({ 'a' : 200, 'b' : 5000 });

// result：12 15
// testFn ({ undefined });

/**
 * 如果调用testFn ()参数列表里面有undefined，那么就默认取默认值，
 * 除了undefined之外的其它值都是打印这个值，比如testFn ({ null });
 * 那么此时会抛出错误(这是跟函数的数组参数的解构和默认值唯一的区别)，
 * 特别注意下
 */
// 我这里只是举例子是null值，只要不是undefined值都会抛出错误
// testFn ({  null, 'b' : 5000 });

// 这个没有问题
// result：12 5000
testFn ({ undefined, 'b' : 5000 });
